/**
 * Copyright 2011 Google
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.google.appengine.codelab;

import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.PropertyProjection;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;

/**
 * This class defines the methods for basic operations of create, update & retrieve
 * for Localidade entity
 * 
 * @author 
 *
 */
public class Localidade {

	/**
	 * Checks if the entity is existing and if it is not, it creates the entity
	 * else it updates the entity
	 * 
	 * @param localidade_latitude
	 *          : latitude for the Localidade
	 * @param localidade_longitude
	 *          : latitude of the Localidade
	 * @param localidade_address
	 *          : address of the Localidade
	 * @param localidade_city
	 *          : city of Localidade
	 * @param localidade_state
	 *          : state phone number
	 * @param localidade_country
	 *          : country of Localidade         
	 * @param localidade_zip
	 *          : email id of Localidade
	 */
  public static void createOrUpdateLocalidade(String localidade_id,  Float localidade_latitude, Float localidade_longitude,
			String localidade_address, String localidade_city, String localidade_state, String localidade_country, String localidade_zip) {
	  
    Entity localidade = getSingleLocalidade(localidade_id);
    if (localidade == null) {
      localidade = new Entity("Localidade", localidade_id);
      localidade.setProperty("localidade_id", localidade_id);
      localidade.setProperty("localidade_latitude", localidade_latitude);
      localidade.setProperty("localidade_longitude", localidade_longitude);
      localidade.setProperty("localidade_address", localidade_address);
      localidade.setProperty("localidade_city", localidade_city);
      localidade.setProperty("localidade_state", localidade_state);
      localidade.setProperty("localidade_country", localidade_country);
      localidade.setProperty("localidade_zip", localidade_zip);
    
    } else {
      if (localidade_latitude != null && !"".equals(localidade_latitude)) {
        localidade.setProperty("localidade_latitude", localidade_latitude);
      }
      if (localidade_latitude != null && !"".equals(localidade_latitude)) {
        localidade.setProperty("localidade_longitude", localidade_longitude);
      }
      if (localidade_address != null && !"".equals(localidade_address)) {
        localidade.setProperty("localidade_address", localidade_address);
      }
      if (localidade_city != null && !"".equals(localidade_city)) {
        localidade.setProperty("localidade_city", localidade_city);
      }
      if (localidade_state != null && !"".equals(localidade_state)) {
        localidade.setProperty("localidade_state", localidade_state);
      }
      if (localidade_country != null && !"".equals(localidade_country)) {
        localidade.setProperty("localidade_country", localidade_country);
      }
      if (localidade_zip != null && !"".equals(localidade_zip)) {
        localidade.setProperty("localidade_zip", localidade_zip);
      }
    }
    Util.persistEntity(localidade);
  }
  
	/**
	 * List all the localidades available
	 * 
	 * @return an iterable list with all the localidades
	 */
  public static Iterable<Entity> getAllLocalidades() {
    Iterable<Entity> entities = Util.listEntities("Localidade", null, null);
    return entities;
  }

	/**
	 * Searches for a Localidade and returns the entity as an iterable The search is
	 * performed by creating a query and searching for the attribute
	 * 
	 * @param localidade
	 *          : zip of the localidade
	 * @return iterable with the localidades searched for
	 */
  public static Iterable<Entity> getLocalidade(String localidade_id) {
    Iterable<Entity> entities = Util.listEntities("Localidade", "localidade_id",localidade_id);
    return entities;
  }

  public static Iterable<Entity> listarEstados( String pais ){
	  if( pais == null || pais.isEmpty() ){
		  return null;
	  }
	  
	  Query query = new Query("Localidade");
	  query.addFilter("localidade_country", FilterOperator.EQUAL, pais);
	  query.addProjection(new PropertyProjection("localidade_state", String.class));
	  query.setDistinct(true);

	  return DatastoreServiceFactory.getDatastoreService().prepare(query).asIterable();
  }

  public static Iterable<Entity> listarCidades( String estado ){
	  if( estado == null || estado.isEmpty() ){
		  return null;
	  }
	  
	  Query query = new Query("Localidade");
	  query.addFilter("localidade_state", FilterOperator.EQUAL, estado);
	  query.addProjection(new PropertyProjection("localidade_city", String.class));
	  query.setDistinct(true);

	  return DatastoreServiceFactory.getDatastoreService().prepare(query).asIterable();
  }

  public static List<String> listarPaises()
  {
	    Query query = new Query("Localidade");
	    query.addProjection(new PropertyProjection("localidade_country", String.class));
	    query.setDistinct(true);

	    Iterable<Entity> iterable = DatastoreServiceFactory.getDatastoreService().prepare(query).asIterable();
	    List<String> paises = new ArrayList<String>();
	    
	    for( Entity entity : iterable ){
	    	paises.add( (String) entity.getProperty("localidade_country"));
	    }
	    
	    return paises;
  }
  
  
	/**
	 * Searches for a localidade and returns the entity as an iterable The search is
	 * key based instead of query
	 * 
	 * @param localidade_id
	 *          : id of the localidade
	 * @return the entity with the localidade as key
	 */
  public static Entity getSingleLocalidade(String localidade_id) {
	    Iterable<Entity> results = Util.listEntities("Localidade", "localidade_id", localidade_id);
	    List<Entity> entity = new ArrayList<Entity>();
	    for(Entity e : results)
	      if(e!=null)
	        entity.add(e);
	      if (!entity.isEmpty()) {
	        return (Entity)entity.remove(0);
	      }
		  return null;
}
  
  	//Metodo Adicionado por Anderson - US13
	 public static Iterable<Entity> getLocalidadePaisEstadoCidade(String localidade_country,String localidade_state, String localidade_city) {
		    Iterable<Entity> entities = Util.listEntitiesLocalidadePaisEstadoCidade(localidade_country, localidade_state, localidade_city);
		    
		    return entities;
	   }
}
